# 1.16 筛选序列中的元素
# 解决方案 : 最简单的方法就是用列表推导式 (list comprehension):
mylist = [1,4,5,-15,10,7,2,3,-1]
x = [n for n in mylist if n > 0 ]
print(x)
# 上面的例子, 如果输入非常大的话. 可能会有个庞大结果, 可以使用生成器表达式通过迭代的方式产生筛选结果:
pos = ( n for n in mylist if n>0)
for x2 in pos:
    print(x2)

#当序列中数据不规范, 无法直接使用推导式,或者生成器表达式, 可以通过单独的筛选逻辑封装成函数,并使用filter()函数处理, 如:
mylist = mylist + ['N/A','-']
def is_int(val):
    try:
        x = int(val)
        return True
    except ValueError:
        return False
#简单方式判断是否是int
def is_int2(val):
    return isinstance(val,int)
print(list(filter(is_int2, mylist)))  # filter()函数接收一个函数 f 和一个list，这个函数 f 的作用是对每个元素进行判断，返回 True或 False

#另一个筛选工具 itertools.compress()
from itertools import compress
a = compress('ABCDE', [1,1,0,0,0]) # 筛选后面为frue的数据, ['A','B']


# 1.17 从这点中提取子集
# 解决方案 使用字典推导式
prices= {
    'apple':45,
    'IBM':206,
    'FB':201,
    'HPQ':37
}
p1 = {k:v for k,v in prices.items() if v >200}
print(p1)